# 1、Excel表【合并单元格】拆分

## 2、按组别将原表拆分多个Excel表格，并以组名命名

import xlwings as xw

def split_and_assign(wb ,rng_group:str, rng_secretary:str):
    sht = wb.sheets('sheet1')   # 选定工作表
    # 处理【组别合并单元格】
    rng = sht.range(rng_group)  # 确定【组别合并单元格】的工作区域（range），通过参数rng_group获得
    group_value = rng.value  # 返回【组别合并单元格】区域的值，是一个列表,如["第一组"， None， None， ...]
    # print(group_name)
    rng.unmerge()   # 拆分【组别并单元格】
    rng.value = group_value[0]   # 拆分后给这个区域总体赋值

    # 处理【答辩秘书分组】
    rng = sht.range(rng_secretary)
    secretary_name = rng.value
    rng.unmerge()
    rng.value = secretary_name[0]

# 脚本运行
if __name__ == "__main__":

    wb = xw.Book("./data/2022届毕业设计第一次答辩分组.xlsx")

    for i in range(1, 10):
        s1 = "H" + str(22*(i-1) + 3) + ":" + "H" + str(22*i + 2)
        # print(s1)
        s2 = "I" + str(22*(i-1) + 3) + ":" + "I" + str(22*i + 2)
        split_and_assign(wb, s1, s2)

    for i in range(0, 4):
        s1 = "H" + str(201 + 21 * i) + ":" + "H" + str(201 + 21 * (i+1) - 1)
        # print(s1)
        s2 = "I" + str(201 + 21 * i) + ":" + "I" + str(201 + 21 * (i+1) - 1)
        split_and_assign(wb, s1, s2)

    wb.save("./Data_out/2022届毕业设计第一次答辩分组-new.xlsx")


# //分隔

import xlwings as xw

def split_table(wb, rng_merge_1: str, group: str):
    '''
    功能：将源表中每个分组连同表头拷贝到一个新表，并以分组名命名新表格
    调用示例：split_table(wb, s1_1, group_dic[i])
    参数说明：
    :param wb: 源工作簿
    :param rng_merge_1: 源表中某个分组的区域
    :param group: 分组信息（"第一组","第二组", ....）,
    方便以中文分组名称保存excel文件
    :return: None
    '''
    # 选定源表中的sheet
    sht = wb.sheets['sheet1']

    # 新生成工作簿，并拷贝组内容
    wb_new = xw.Book()
    # 指定待操作的工作表（sheet)
    sht_new = wb_new.sheets('sheet1')
    # 修改列宽
    sht_new.range("B1").column_width = 15
    sht_new.range("D1").column_width = 15
    sht_new.range("E1").column_width = 15
    sht_new.range("G1").column_width = 15
    sht_new.range("F1").column_width = 45

    # 从源表中拷贝表头
    rng_table = sht.range("A1:I2")  # 指定复制区域
    content_copy = rng_table.copy() # 取得复制内容
    rng_paste = sht_new.range("A1:I2")  # 指定目标区域
    rng_paste.paste()   # 目标区域粘贴

    # 从源表中拷贝分组信息
    rng_table = sht.range(rng_merge_1)  # 指定分组区域
    content_copy = rng_table.copy() # 取得复制内容
    rng_paste = sht_new.range("A3") # 指定目标区域，只需指定区域的左上角单元格区域，粘贴时，会根据复制的内容自动识别扩展
    rng_paste.paste()   # 粘贴内容

    wb_new.save("./Data_out/" + group + ".xlsx")    # 分组名保存excel
    wb_new.close()  # 关闭此分组表格


if __name__ == "__main__":

    # 组字典
    group_dic = {1: "第一组", 2: "第二组", 3: "第三组",
                 4: "第四组", 5: "第五组", 6: "第六组",
                 7: "第七组", 8: "第八组", 9: "第九组",
                 10: "第十组", 11: "第十一组", 12: "第十二组",
                 13: "第十三组"
                 }

    wb = xw.Book("./Data_out/2022届毕业设计第一次答辩分组-new.xlsx")
    # 分析此Excel表格，发现：
    # ① 表头占两行
    # ② 第1 ~ 第9组 每组22人
    # ③ 第10 ~ 第13组 每组21人

    # 处理 1~9组
    for i in range(1, 10):
        # 组别每组的range
        s1_1 = "A" + str(22 * (i - 1) + 3) + ":" + "I" + str(22 * i + 2)

        # 将每组数据拷贝到以组名命名的excel表格中
        split_table(wb, s1_1, group_dic[i])

    # 处理 10~13组
    for i in range(0, 4):
        s2_1 = "A" + str(201 + 21 * i) + ":" + "I" + str(201 + 21 * (i+1) - 1)

        # 将每组数据拷贝到以组名命名的excel表格中
        split_table(wb, s2_1, group_dic[i+10])

    wb.close()